package com.tedu.api.ee;

import jdk.internal.dynalink.beans.StaticClass;
import org.junit.Test;

/**
 * Java有一套完善的异常处理操作：
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 *
 *
 * Throwable顶级超类--抛出错误：
 * 子类：Exception对象：程序级别的错误(经常遇见)
 *                    编译期--FileOutputStream(编写代码同时，下方波浪线错误)
 *                    处理方式：1.抛出异常：不管什么错误，都抛出方法外
 *                            2.捕获异常：抓到异常，记录异常错误信息
 *                     检查异常：通常由编译器检查处理，存在异常类，抛出、捕获 ！
 *
 *                    运行期--控制台（IDE开发工具控制台，显示出红色，异常类名字）
 *                    非检查异常：RuntimeException(认为所有异常来自于RuntimeException)
 *                    所有异常都是RuntimeException的子类
 *
 * 子类：Error对象：描述系统级别的错误(不常见)
 *      -----测试：程序挂了    利用字符串不断拼接--产生Error
 *      String str="字符串";   直接量写出字符串---存常量池
 */
public class EE {
    /**
     * Error错误---递归方式栈溢出
     * 1.创建静态方法  method
     * 2.在静态方法中调用method
     * 3.通过testError单元测试--调用EE对象下的method
     */
    public static void method(){
        method();//会一直调自己
    }
    @Test
    public  void testError() {
      EE.method();
    }
    //Exception  检查异常 ---处理手段2：捕获方式----预判：程序出什么异常

    /**
     * 捕获异常语法：
     * try{
     * 可能出现异常代码段中添加
     * }catch(异常名字 【小异常】e){
     *     e.printStackTrace();打印异常信息
     *                         方便开发者查询原因
     * }catch(异常名字 【中异常】e){
     *     e.printStackTrace();
     * }catch(异常名字 【大异常】e){
     *     e.printStackTrace();
     * }finally{
     *     捕获异常---必须执行代码块--IO关闭流
     * }
     *
     * 捕获异常的快捷键：ctrl+alt+t    先选中可能出现错误的代码块
     */
    @Test
    public void testException(){
        try {
            String s="a";
            //StringIndexOutOfBoundsException异常--字符串下标越界异常
            //异常产生原因：指定下标超出字符串的范围！
            s.charAt(0);

            //NullPointerException异常--空指针异常
            //异常产生原因：字符串为空，拿到数据值为空时
            s.length();

            //NumberFormatException异常--数值转换异常
            //异常产生原因：将存储的不是整数的字符串转换为整数！
            Integer.parseInt(s);   //a  是整数类型
        } catch (NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常的信息--提供线索
        }catch (NullPointerException e) {//空指针异常
            e.printStackTrace();//打印异常的信息--提供线索
        }catch (StringIndexOutOfBoundsException e) {//下标越界异常
            e.printStackTrace();//打印异常的信息--提供线索
        }
        finally {
            System.out.println( "一直执行代码块");
        }
    }


    //作业1.写出代码段5个错误【分开：1次抓1个错误】，使用try---catch捕获打印信
    //提示：字符串、集合中、标准IO流、包装类---看API
}
